package org.zhb.querysql.core.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.handler.PerConnectionWebSocketHandler;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.zhb.querysql.websocket.client.GreetingService;
import org.zhb.querysql.websocket.client.DefaultGreetingService;
import org.zhb.querysql.websocket.echo.DefaultEchoService;
import org.zhb.querysql.websocket.echo.EchoService;
import org.zhb.querysql.websocket.echo.EchoWebSocketHandler;
import org.zhb.querysql.websocket.reverse.ReverseWebSocketEndpoint;
import org.zhb.querysql.websocket.snake.SnakeWebSocketHandler;

/**
 * @Title: WebSocketConfig.java
 * @Package org.zhb.querysql.core.config
 * @Description:WebSocket服务的核心配置文件
 * @author zhb
 * @date 2016年5月12日 上午10:04:45
 * @version V1.0
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
	/**
	 * 注册websocket服务 将服务注册成为一个websocket服务,那么外面的服务就可以通过这个被注册的服务发起访问,进行消息的传输
	 */
	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		//通过注册方式,发布成一个websocket服务,withSockJS,是添加sockjs支持
		//也可以通过注解的方式来发布ws服务
		registry.addHandler(echoWebSocketHandler(), "/echo").withSockJS();
	}

	/**
	 * @Title: echoService
	 * @Description:消息处理类
	 * @return
	 * @return: EchoService
	 * @author: zhb
	 * @throws 2016年5月12日上午10:12:33
	 */
	public @Bean EchoService echoService() {
		return new DefaultEchoService("你是说: \"%s\"?");
	}

	public @Bean GreetingService greetingService() {
		return new DefaultGreetingService();
	}

	/**
	 * @Title: echoWebSocketHandler
	 * @Description:消息转换类,对客户端发送过来的信息进行处理
	 * @return
	 * @return: WebSocketHandler
	 * @author: zhb
	 * @throws 2016年5月12日上午10:12:19
	 */
	public @Bean WebSocketHandler echoWebSocketHandler() {
		return new EchoWebSocketHandler(echoService());
	}

	public @Bean WebSocketHandler snakeWebSocketHandler() {
		return new PerConnectionWebSocketHandler(SnakeWebSocketHandler.class);
	}

	public @Bean ReverseWebSocketEndpoint reverseWebSocketEndpoint() {
		return new ReverseWebSocketEndpoint();
	}

	public @Bean ServerEndpointExporter serverEndpointExporter() {
		return new ServerEndpointExporter();
	}
}